home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / goki2 / src / goki2.c next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.8 KB  |  312 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. //#include <eintm.h>
  12. #include <KH.h>
  13. #include <dlib.h>
  14. #include <mos.h>
  15.  
  16. //#define DEBUG
  17.  
  18. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  19.  
  20. int    dialogID = -1 ;
  21. int    iconID = -1 ;
  22.  
  23. void    userIdleTask(void);        //アイドルタスク
  24. void    setDirectory(void);        //次の進行方向と距離を決める
  25. void    toBackGround(void);        //バックグラウンドにする
  26. void    getScreenSize(void);    //画面の大きさを取得
  27.  
  28. unsigned char    g_Count;    //ごきの動く数(=0:停止中 =1:停止開始 >1:逃走中)
  29. int                g_X,g_Y;    //ごきの位置
  30. unsigned char    g_Angle;    //ごきの向き(0~7)
  31. FRAME            screen;        //画面の大きさ
  32. FRAME            gfr;
  33. EVENT            gev;
  34. int                myID;        //自分のアプリID
  35. int                shellID;    //シェルのアプリID
  36. int                xx[8] = {  0,  9, 12,  9,  0,  -9, -12,  -9};
  37. int                yy[8] = {-12, -9,  0,  9, 12,   9,   0,  -9};
  38.  
  39. int userFunc(apliId, messId, info, data)
  40. int    apliId;
  41. int    messId;
  42. int    info;
  43. int    data;
  44. {
  45.     register int    ret;
  46.  
  47.     ret = ILLEGAL_FUNCTION;
  48.  
  49.     switch(messId)
  50.     {
  51.         case    GM_QUIT :
  52.         case    GM_PURGE :
  53.             MMI_SetHaltFlag(TRUE);
  54.             ret = NOERR ;
  55.             break;
  56.  
  57.         case    GM_WAKE :
  58.             toBackGround();            //バックグラウンドにする
  59.             break;
  60.  
  61.         case    GM_POSTSCRCHG :
  62.             getScreenSize();        //画面の大きさを取得
  63.             break;
  64.  
  65.         default:
  66.             break;
  67.     }
  68.  
  69.     return(ret);
  70. }
  71.  
  72. void main()
  73. {
  74.     static MMICTRL mmi ={
  75.                 SCREEN16|SCREENIGNORE,        // ページ0側解像度
  76.                 SCREENUNUSED,                // ページ1側解像度
  77.                 0,                             // 書き込みページ
  78.                 SCREENAVAILABLE,             // 表示ページ
  79.                 0,                             // 表示プライオリティ
  80.                 SCREENAVAILABLE,            // 色数
  81.                 SCREENEXPAND,                 // VRAMの横の長さ
  82.                 0,                             // メモリ領域の大きさ
  83.                 NULL,                         // メモリ領域のアドレス
  84.                 0,                             // ユーザ領域の大きさ
  85.                 NULL,                         // ユーザ領域のアドレス
  86.                 0, 0,                         // 画面枠    lupx,lupy
  87.                 0, 0,                        //            rdwx,rdwy
  88.                 -16384, -16384,                // 移動枠    lupx,lupy
  89.                 16383, 16383,                //            rdwx,rdwy
  90.                 15,                         // 白色
  91.                 8,                          // 黒色
  92.                 7,                          // 灰色
  93.                 6                             // 反転色
  94.     };
  95.  
  96.     extern int APL_init() ;
  97.  
  98.     /*    初期化処理    */
  99.     if (MMI_Open( &mmi ) == NOERR)
  100.     {
  101.         /*    初期化に成功すればメインループに入る.    */
  102.         if (APL_init() == NOERR)
  103.         {
  104.             MMI_ExecSystem() ;
  105.             ICNTerm();
  106.         }
  107.     }
  108.  
  109.     /*    終了処理    */
  110.     MMI_Close() ;
  111.  
  112. }
  113.  
  114. int APL_init()
  115. {
  116.     extern MMIINIT    initDataGUI ;
  117.  
  118.     int    ret,mret,mptr ;
  119.  
  120.     mret = MG_PushPtr(MB_WAIT,&mptr);        //    MB_WAIT==目覚まし時計
  121.  
  122.     /*    EGB ワークアドレスの取得.    */
  123.     guiEgbPtr = MMI_GetEgbPtr() ;
  124.  
  125.     /*    ユーザアイコン設定        */
  126.     extern unsigned char *iconTbl[];
  127.     extern int iconMaxId;
  128.     MMI_SetIconTable(iconTbl, iconMaxId);
  129.  
  130.     /*    ハイパ型部品の初期化            */
  131.     if ((ret = MMI_initHyper()) < 0)
  132.         return ret ;
  133.     /*    ダイアログ型部品の初期化        */
  134.     if ((ret = MMI_initDialogL40()) < 0)
  135.         return ret ;
  136.     /*    ボタン型部品の初期化            */
  137.     if ((ret = MMI_initButtonL40()) < 0)
  138.         return ret ;
  139.     /*    アイコンボタン型部品の初期化    */
  140.     if ((ret = MMI_initIconL40()) < 0)
  141.         return ret ;
  142.  
  143.     /*    背景データの初期化                        */
  144.  
  145.     /*    データの登録        */
  146.     if ((ret = MMI_Init(&initDataGUI)) < 0)
  147.         return ret ;
  148.  
  149.     //    Tmenuにパレットを合わせる
  150.     KH_initGuiColor();
  151.  
  152.     ICNInit(0);
  153.  
  154.     //自分とシェルのアプリIDを取得
  155.     myID = MMI_GetApliId();
  156.     shellID = MMI_CallMessage( myID, GM_QUERYID, QM_ALLKIND, 0 );
  157.  
  158.     //乱数まぜまぜ
  159.     int b,x,y;
  160.     MOS_rdpos(&b,&x,&y);
  161.     srand(b+(x<2)+(y<3));
  162.  
  163.     //画面の大きさ取得
  164.     getScreenSize();
  165.  
  166.     //始めの位置
  167.     g_X = screen.lupx + (rand() % (screen.rdwx-screen.lupx)) ;
  168.     g_Y = screen.lupy + (rand() % (screen.rdwy-screen.lupy)) ;
  169.     g_Angle = rand() & 7;
  170.     #ifdef DEBUG
  171.     printf("start(%d,%d)|Angle=%d\n",g_X,g_Y,g_Angle);
  172.     #endif
  173.     gfr.lupx = g_X;
  174.     gfr.lupy = g_Y;
  175.     gfr.rdwx = g_X+23;
  176.     gfr.rdwy = g_Y+23;
  177.     MMI_SendMessage(dialogID,MM_MOVE,1,&gfr);
  178.  
  179.     /*    背景を表示する                            */
  180.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  181.  
  182.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc);
  183.     MMI_CallMessage(myID, GM_TITLE, (int)"ごき♪                          By 機拡", 0);
  184.  
  185.     extern void userIdleTask(void);
  186.     //    アイドルタスク登録
  187.     MMI_SetIdleTaskFunc( userIdleTask );
  188.  
  189.     //始めの移動方向セット
  190.     setDirectory();
  191.  
  192.     //バックグラウンド
  193.     toBackGround();
  194.  
  195.     if(mret==0) MG_PopPtr( mptr );
  196.  
  197.     return NOERR ;
  198. }
  199.  
  200. void    userIdleTask(void)
  201. {
  202.     if(g_Count<2)
  203.     {
  204.         if(g_Count==1)    //停止したばっかり
  205.         {
  206.             (( POINT * )&( gev.info ))->x = g_X+12;
  207.             (( POINT * )&( gev.info ))->y = g_Y+12;
  208.             g_Count=0;
  209.             #ifdef DEBUG
  210.             printf("center(%d,%d)\n",g_X+12,g_Y+12);
  211.             #endif
  212.         }
  213.         int apliID;
  214.         apliID = MMI_CallMessage( myID , GM_ONPARTS, ( int )&gev, 0 );
  215.         #ifdef DEBUG
  216.         printf("apli=%d|my=%d|shell=%d\n",apliID,myID,shellID);
  217.         #endif
  218.         if((apliID == shellID) || (apliID == myID))
  219.         {    //次の移動方向を決める
  220.             setDirectory();
  221.         }
  222.     } else
  223.     {    //ごきの移動
  224.         #ifdef DEBUG
  225.         printf("move(%d,%d)->",g_X,g_Y);
  226.         #endif
  227.         char flag=0;
  228.         g_X += xx[g_Angle] ;
  229.         g_Y += yy[g_Angle] ;
  230.         if(g_X<screen.lupx) {g_X=screen.lupx;flag=1;}
  231.         else if(g_X>screen.rdwx) {g_X=screen.rdwx;flag=1;}
  232.         if(g_Y<screen.lupy) {g_Y=screen.lupy;flag=1;}
  233.         else if(g_Y>screen.rdwy) {g_Y=screen.rdwy;flag=1;}
  234.         if(flag==1)
  235.         {
  236.             g_Angle += 2;
  237.             if(g_Angle>7) g_Angle -= 8;
  238.         }
  239.         #ifdef DEBUG
  240.         printf("(%d,%d)\n",g_X,g_Y);
  241.         #endif
  242.         gfr.lupx = g_X;
  243.         gfr.lupy = g_Y;
  244.         gfr.rdwx = g_X+23;
  245.         gfr.rdwy = g_Y+23;
  246.         MMI_SendMessage(iconID,MM_SETSHAPE,1,512+(g_Angle<<1)+(g_Count&1) );
  247.         MMI_SendMessage(dialogID,MM_ERASE,0);
  248.         MMI_SendMessage(dialogID,MM_MOVE,1,&gfr);
  249.         MMI_SendMessage(dialogID,MM_SHOW,0);
  250.         #ifdef DEBUG
  251.         printf("(%d,%d)-(%d,%d)|Angle=%d|Count=%d|Icon=%d\n",
  252.                 gfr.lupx,gfr.lupy,gfr.rdwx,gfr.rdwy,
  253.                 g_Angle,g_Count,512+(g_Angle<<1)+(g_Count&1) );
  254.         #endif
  255.         --g_Count;
  256.     }
  257.  
  258.     return ;
  259. }
  260.  
  261. void    setDirectory(void)
  262. {
  263.     g_Angle += ((rand() & 3) - 1);
  264.     if(g_Angle>7) g_Angle = (g_Angle % 8);
  265.     g_Count = 2+(rand() & 15);
  266.     #ifdef DEBUG
  267.     printf("NewAngle=%d|NewCount=%d\n",
  268.             g_Angle,g_Count);
  269.     #endif
  270.  
  271.     return ;
  272. }
  273.  
  274. void    toBackGround(void)
  275. {
  276.     MMI_CallMessage( myID, GM_SLEEP, 0 , 0);
  277.  
  278.     if(myID==MMI_CallMessage( myID, GM_QUERYID, QM_ALLKIND, 1))
  279.         MMI_CallMessage( myID, GM_TASKLIST, 0, 0 );
  280.  
  281.     return ;
  282. }
  283.  
  284. void    getScreenSize(void)
  285. {
  286.     WINCTRL *pctrl ;
  287.     //    WINCTRL構造体から画面最大サイズ(現在の解像度)を取得する
  288.     MMI_GetControl(&pctrl) ;
  289.     screen.lupx = pctrl->bound.lupx;
  290.     screen.lupy = pctrl->bound.lupy;
  291.     screen.rdwx = pctrl->bound.rdwx-24;
  292.     screen.rdwy = pctrl->bound.rdwy-24;
  293.  
  294.     int flag=0;
  295.     if(g_X<screen.lupx) {g_X=screen.lupx;flag=1;}
  296.     else if(g_X>screen.rdwx) {g_X=screen.rdwx;flag=1;}
  297.     if(g_Y<screen.lupy) {g_Y=screen.lupy;flag=1;}
  298.     else if(g_Y>screen.rdwy) {g_Y=screen.rdwy;flag=1;}
  299.     if(flag==1)
  300.     {
  301.         g_Angle += 2;
  302.         if(g_Angle>7) g_Angle -= 8;
  303.     }
  304.  
  305.     #ifdef DEBUG
  306.     printf("scr(%d,%d)-(%d,%d)\n",
  307.             screen.lupx,screen.lupy,screen.rdwx,screen.rdwy);
  308.     #endif
  309.  
  310.     return ;
  311. }
  312.